/*
 * maz_drv_bitband.h
 *
 *  Created on: 2020年2月8日
 *      Author: Paul
 */

#ifndef INC_MAZ_DRV_BITBAND_H_
#define INC_MAZ_DRV_BITBAND_H_

#include "maz_drv.h"

/* gpio port definition */
#define PA                      GPIOA_BASE
#define PB                      GPIOB_BASE
#define PC                      GPIOC_BASE
#define PH                      GPIOH_BASE

/* bitband conversion formula */
#define MEMADDR(addr)           (*((volatile unsigned long *)(addr)))
#define BITBAND(addr, bitnum)   MEMADDR((addr & 0xF0000000) + 0x02000000 + ((addr & 0x00FFFFFF) << 5) + (bitnum << 2))

/**
 * @brief 使用下面的宏定义可以快速的操作指定的GPIO
 * @usage 1. 使用GPI获取指定的GPIO的状态
 *           GPI(PA, 0);
 *        2. 使用GPO控制指定的GPIO输出
 *           GPO(PA, 0) = 1;
 */
#define GPI(port, pin)          BITBAND((port + 0x08), pin)
#define GPO(port, pin)          BITBAND((port + 0x0c), pin)

#endif /* INC_MAZ_DRV_BITBAND_H_ */
